# -*- coding: utf-8 -*-
"""
Created on Tue Aug  4 14:06:02 2020

@author: Songyou Han
"""

import requests
import pymysql
import json
import time

# 打开数据库连接 #连接本地爬虫数据库
database = pymysql.connect(host="localhost", user="root", password="663666", port=3306, db='btu')
cursor = database.cursor()
table = 'huobi_digit_coin_candle_daily'

# 火币API请求历史k线数据的基本url
base_url = "https://api.huobipro.com/market/history/kline?period=1day&size=300&symbol="


# 请求函数 参数：（数字火币币种，计价稳定比币种）
def get_coin_candle(digit_coin, stable_coin):
    url = base_url + digit_coin + stable_coin + "&AccessKeyId=3290265c-208217e4-9f4199c1-mk0lklo0de"
    print(url)
    # 无限循环请求数据，直到成功为止
    while True:
        try:
            r = requests.get(url, timeout=30)
            print("成功请求%s/%s历史K线数据" % (digit_coin, stable_coin))
            break
        except:
            print("数据请求超时，10s后再次尝试")
            time.sleep(10)
    datas = r.json()  # 将字符串序列转换为json
    datas = datas["data"]  # 获取数据列表
    print("开始装载数据 。。。。")
    for data in datas:
        insert_date = load_data(data, digit_coin, stable_coin)
        print(insert_date)
        if insert_date:
            print(str(insert_date) + " " + str(digit_coin) + " K线数据写入数据库 成功。。。。")


# 入库函数：参数：（json数据，基础币种，计价币种）
def load_data(data, digit_coin, stable_coin):
    # 数据预处理
    date = time.strftime('%Y-%m-%d', time.localtime(data["id"]))  # 通过时间戳获取K线日期
    print(data)
    data.update({"date": date, "coin_symbol": digit_coin, "stable_coin": stable_coin})  # 向数据中加入日期和币种
    del data["id"]  # 删除时间戳

    # SQL准备
    keys = ','.join(data.keys())  # 生成sql字段序列
    values = ','.join(['%s'] * len(data))  # 生成sql值填充占位符序列
    sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys,
                                                                                         values=values)
    update = ','.join([" {key} = %s".format(key=key) for key in data])  # sql插入更新语句
    sql += update  # 生成完整sql插入更新语句

    try:
        database.ping(reconnect=True)
        cursor.execute(sql, tuple(data.values()) * 2)
        database.commit()
        print("Success")
        return date
    except:
        print('Failed')
        database.rollback()

    # 获取数据并写入数据库


datas = get_coin_candle("btc", "usdt")

# 打印结束语句
print("--------------------------")
print("---------COMPLETE---------")

# 关闭数据库连接
cursor.close()
database.close()